package Enea.server;

import Enea.project.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

/**
 * Questa classe si occupa di generare i pacchetti XML in base al codice
 * e ai vari input secondo il protocollo WUTP.
 * 
 * @author Davide Aversa
 */
public abstract class WUTPServerWriter {
    
    /**
     * Crea un messaggio WUTP di risposta di categoria 1XX.
     * 
     * @param code Il codice del messaggio di risposta.
     * @param projectid Il codice del progetto.
     * @param client Il client associato al messaggio.
     * @return Il Document contenente il pacchetto da inviare.
     * @throws javax.xml.parsers.ParserConfigurationException
     */
    public static Document createMessage1x(int code, int projectid, ClientData client) throws ParserConfigurationException {
        //Crea un Document vuoto.
        DocumentBuilderFactory docBuilderFact = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFact.newDocumentBuilder();
        Document result = docBuilder.newDocument();
        
        //Crea il nodo radice del pacchetto.
        Element root = result.createElement("wutp");
        result.appendChild(root);
        
        //Inizializza i due elementi da inserire.
        Element elemcode = result.createElement("code");
        Element elemmex = result.createElement("message");
        Element elemclient = result.createElement("clientid");
        Element elemproject = result.createElement("projectid");
        
        switch (code) {
            case 101: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Registrazione Completa"));
            root.appendChild(elemmex);
            elemclient.appendChild(result.createTextNode(""+client.getClientid()));
            root.appendChild(elemclient);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            break;
            
            case 102: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Massimo Numero Client Raggiunto"));
            root.appendChild(elemmex);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            break;
            
            default: return null;
        }
        
        return result; 
    }
    
    /**
     * Crea un messaggio WUTP di risposta di categoria 2XX.
     * @param code Il codice del messaggio da inviare.
     * @param wu La WU da consegnare.
     * @param projectid L'ID del progetto del server.
     * @return Il Document contenente il pacchetto.
     * @throws javax.xml.parsers.ParserConfigurationException
     */
    public static Document createMessage2x(int code, int projectid, WorkUnit wu) throws ParserConfigurationException {
        //Crea un Document vuoto.
        DocumentBuilderFactory docBuilderFact = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFact.newDocumentBuilder();
        Document result = docBuilder.newDocument();
        
        //Crea il nodo radice del pacchetto.
        Element root = result.createElement("wutp");
        result.appendChild(root);
        
        //Inizializza i due elementi da inserire.
        Element elemcode = result.createElement("code");
        Element elemmex = result.createElement("message");
        Element elemproject = result.createElement("projectid");
        Element elemwuid = result.createElement("wuid");
        Element elembyte = result.createElement("sizebyte");
        Element elempu = result.createElement("sizepu");
        Element elemdata = result.createElement("data");
        
        switch (code) {
            case 201: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("WU Consegnata"));
            root.appendChild(elemmex);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            elemwuid.appendChild(result.createTextNode(""+wu.getCode()));
            root.appendChild(elemwuid);
            elembyte.appendChild(result.createTextNode(""+wu.getSizeByte()));
            root.appendChild(elembyte);
            elempu.appendChild(result.createTextNode(""+wu.getSyzePU()));
            root.appendChild(elempu);
            elemdata.appendChild(result.createTextNode(wu.getData()));
            root.appendChild(elemdata);
            break;
            
            case 202: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Nessuna WU Disponibile"));
            root.appendChild(elemmex);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            break;
            
            default: return null;
        }
        
        return result;
    }
    
    /**
     * Crea un messaggio WUTP di risposta di categoria 3XX.
     * 
     * @param code Il codice del messaggio da generare.
     * @param projectid Il codice del progetto del server.
     * @return Il Document contenente il pacchetto.
     * @throws javax.xml.parsers.ParserConfigurationException
     */
    public static Document createMessage3x(int code, int projectid) throws ParserConfigurationException {
        //Crea un Document vuoto.
        DocumentBuilderFactory docBuilderFact = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFact.newDocumentBuilder();
        Document result = docBuilder.newDocument();
        
        //Crea il nodo radice del pacchetto.
        Element root = result.createElement("wutp");
        result.appendChild(root);
        
        //Inizializza i due elementi da inserire.
        Element elemcode = result.createElement("code");
        Element elemmex = result.createElement("message");
        Element elemproject = result.createElement("projectid");
        
        switch (code) {
            case 301: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("RU Consegnata."));
            root.appendChild(elemmex);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            break;
            
            case 302: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("RU Invalida."));
            root.appendChild(elemmex);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            break;
            
            default: return null;
        }
        
        return result;
    }
    
    /**
     * Crea un messaggio WUTP di risposta di categoria 4XX.
     * @param code Il codice del messaggio da generare.
     * @param projectid Il codice del progetto del server.
     * @param stats Il pacchetto di statistiche globali.
     * @return Il Document contenente il messaggio.
     * @throws javax.xml.parsers.ParserConfigurationException
     */
    public static Document createMessage4x(int code, int projectid, GlobalStats stats) throws ParserConfigurationException {
        //Crea un Document vuoto.
        DocumentBuilderFactory docBuilderFact = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFact.newDocumentBuilder();
        Document result = docBuilder.newDocument();

        //Crea il nodo radice del pacchetto.
        Element root = result.createElement("wutp");
        result.appendChild(root);

        //Inizializza i due elementi da inserire.
        Element elemcode = result.createElement("code");
        Element elemmex = result.createElement("message");
        Element elemproject = result.createElement("projectid");
        Element elemclient = result.createElement("clients");
        Element elemprog = result.createElement("progress");
        
        switch (code) {
            case 401: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("RU Invalida."));
            root.appendChild(elemmex);
            elemproject.appendChild(result.createTextNode(""+projectid));
            root.appendChild(elemproject);
            elemclient.appendChild(result.createTextNode(""+stats.getClientsnumber()));
            root.appendChild(elemclient);
            elemprog.appendChild(result.createTextNode(""+stats.getTotalprogres()));
            root.appendChild(elemprog);
            break;
            
            default: return null;
        }
        
        return result;        
    }
    
    /**
     * Genera un pacchetto XML per il WUTP di categoria 5XX.
     * @param code Il codice del pacchetto da generare.
     * @return Se il codice inserito è fra quelli ammissibili restituisce
     * il Document rappresentante il pacchetto. Altrumenti null.
     * @throws javax.xml.parsers.ParserConfigurationException
     */
    public static Document createMessage5x(int code) throws ParserConfigurationException {
        //Crea un Document vuoto.
        DocumentBuilderFactory docBuilderFact = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docBuilderFact.newDocumentBuilder();
        Document result = docBuilder.newDocument();
        
        //Crea il nodo radice del pacchetto.
        Element root = result.createElement("wutp");
        result.appendChild(root);
        
        //Inizializza i due elementi da inserire.
        Element elemcode = result.createElement("code");
        Element elemmex = result.createElement("message");
              
        switch (code) {
            case 501: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Project Completed."));
            root.appendChild(elemmex);
            break;
            
            case 502: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("ProjectID non combacia."));
            root.appendChild(elemmex);
            break;
            
            case 503: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Client non registrato."));
            root.appendChild(elemmex);
            break;
            
            case 504: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Richiesta Incompleta."));
            root.appendChild(elemmex);
            break;
            
            case 505: elemcode.appendChild(result.createTextNode(""+code));
            root.appendChild(elemcode);
            elemmex.appendChild(result.createTextNode("Richiesta Illegibile."));
            root.appendChild(elemmex);
            break;
            
            default: return null;
        }
        
        return result;
    }
}
